package br.com.cotec.dao.impl;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Example;
import org.hibernate.exception.ConstraintViolationException;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.transaction.annotation.Transactional;

import br.com.cotec.dao.EquipamentoDao;
import br.com.cotec.exception.RegistroSendoUtilizadoException;
import br.com.cotec.model.Equipamento;

public class EquipamentoDaoImpl extends GenericDaoImpl<Equipamento, Serializable> implements EquipamentoDao{

	/**
	 * {@inheritDoc}
	 */
	@Transactional
	public boolean exists(String codigo) {
		Equipamento equipamento = (Equipamento) getByCodigo(codigo, new Equipamento());
		return equipamento != null;
	}
	
	/**
	 * {@inheritDoc}
	 * 
	 * @see br.com.cotec.dao.impl.GenericDaoImpl#hasChanged(java.lang.Object)
	 */
	@Override
	@Transactional
	public boolean hasChanged(Equipamento object) {
		List<Equipamento> obj = getByExample(object);
		if (obj == null || obj.size() == 0) {
			return false;
		} else {
			return true;
		}
	}
	
	/**
	 * {@inheritDoc}
	 * 
	 * @see br.com.cotec.dao.impl.GenericDaoImpl#getByExample(java.lang.Object)
	 */
	@SuppressWarnings("unchecked")
	@Override
	public List<Equipamento> getByExample(Equipamento equipamento) {
		Session hibernateSession = (Session) em.getDelegate();
		Criteria criteria = hibernateSession.createCriteria(Equipamento.class, "eq").add(Example.create(equipamento));

		criteria.createCriteria("eq.posicao", "pos", Criteria.INNER_JOIN).add(Example.create(equipamento.getPosicao()));
		criteria.createCriteria("pos.fileira", Criteria.INNER_JOIN).add(Example.create(equipamento.getPosicao().getFileira()));
//		criteria.createCriteria("pos.equipamento", Criteria.INNER_JOIN).add(Example.create(equipamento.getPosicao().getEquipamento()));
		return (List<Equipamento>)criteria.list();
	}

	/**
	 * {@inheritDoc}
	 * 
	 * @throws RegistroSendoUtilizadoException 
	 */
	@Override
	public void remove(Equipamento equipamento) throws RegistroSendoUtilizadoException, Exception {
			try {
				em.remove(equipamento);
			} catch (ConstraintViolationException e) {
				throw new RegistroSendoUtilizadoException("erroRemoverRegistroUsado");
			} catch (DataIntegrityViolationException e) {
				throw new RegistroSendoUtilizadoException("erroRemoverRegistroUsado");
			} catch (Exception e) {
				throw new Exception();
			}
	}	
}